//
//  CZStatus.swift
//  swiftweibo
//
//  Created by Apple on 15/11/28.
//  Copyright © 2015年 tzw. All rights reserved.
//

import UIKit

import SDWebImage
// 微博数据模型
class CZStatus: NSObject {
    // MARK: - 属性
    // 微博创建时间
    var created_at: String?
    //微博ID
    var id: Int = 0
    // 微博信息内容
    var text: String?
    // 微博来源
    var source: String?
    // 转发数
    var reposts_count: Int = 0
    // 评论数
    var comments_count: Int = 0
    // 表态数
    var attitudes_count: Int = 0
    // 行高
    var rowHeight: CGFloat?
    // 微博缩略图的url地址
    var pic_urls: [[String: AnyObject]]?{
        didSet{
            // 判断是否有图片的地址 
            if pic_urls?.count == 0{
                return
            }
            // 创建一个空的数组用来装图片的地址
            storePictureURLs = [NSURL]()
            // 遍历字典
            for dict in pic_urls!{
                // 获取字典里面的图片urlString
                let urlString = dict["thumbnail_pic"] as! String
                // 转成url
                let url = NSURL(string: urlString)!
                // 把图片地址添加到数组中
                storePictureURLs?.append(url)
            }
        }
    }
    // 缩略图数组
    var storePictureURLs: [NSURL]?
    
    var picImageURLs: [NSURL]?{
//        print("retweeted_status:\(retweeted_status?.storePictureURLs)")
        // 当模型是原创微博则返回原创微博的url，否则返回被转发微博的url
        return retweeted_status == nil ? storePictureURLs : retweeted_status?.storePictureURLs
    }
    
    // 被转发的微博
    var retweeted_status: CZStatus?
    
    // 因为user里面是字典
    var user: CZUser?
    // 根据是否有retweeted_status属性判断是否是转发微博
    func cellId()->String{
        return retweeted_status == nil ? CZStatusReuseIdentifier.NormalCell.rawValue : CZStatusReuseIdentifier.ForwarCell.rawValue
    }
    // MARK: - 字典转模型
    init(dict:[String: AnyObject]) {
        super.init() // 创建对象
        setValuesForKeysWithDictionary(dict)
    }
    // 用kvc的时候找不到对象的时候调用
    override func setValue(value: AnyObject?, forUndefinedKey key: String) {
    }
    // 打印数组对象信息
    override var description: String{
        let properties = ["created_at","id","text","source","reposts_count","comments_count","attitudes_count","user","pic_urls","retweeted_status"]
            return "\n \t模型数据：\(dictionaryWithValuesForKeys(properties))"
    }
    // 用户模型需要自己来转
    override func setValue(value: AnyObject?, forKey key: String) {
//        print("key:\(key)")
        if  key == "user" {
            if let dict = value as? [String: AnyObject]{
//                print("dict:\(dict)")
                // 转模型
                user = CZUser(dict: dict)
            }
            // 一定要记得return
            return
        }
        
        if key == "retweeted_status" {
            if let dict = value as? [String: AnyObject]{
                // 手动转模型
                retweeted_status = CZStatus(dict: dict)
            }
            return
            
        }
        // 调用父类的方法
        super.setValue(value, forKey: key)
        
    }
    

        // 加载数据
    class func loadStatus(finished:(status: [CZStatus]?,error: NSError?)->()) {
        CZNetworkTool.sharedInstance.loadStatus { (result, error) -> () in
            if error != nil || result == nil{
                print("加载数据失败")
                finished(status: nil, error: error)
                return
            }
//            print("result:\(result)")
            // 字典转模型
            if let array = result!["statuses"] as? [[String: AnyObject]]{
                // 创建一个数组来装模型
                var statuses = [CZStatus]()
                // 遍历数组
                for dict in array{
                    let status = CZStatus(dict: dict)
                    statuses.append(status)
                }
                // 给调用者返回数据
//                finished(status: statuses, error: nil)
                // 缓存图片
                self.catceWebImage(statuses, finished: finished)
                
            }else
            {
                // 模型转换失败
                finished(status: nil, error: nil)
            }
        }
    }
    
    // MARK: - 从网络缓存图片
    private class func catceWebImage(statuses:[CZStatus],finished:(statuses: [CZStatus]?,error: NSError?)->()){
        //创建任务组
        let group = dispatch_group_create()
        // 用来记录图片的大小 
        var length = 0
        
        // 遍历模型
        for status in statuses{
            // 判断是否有图片
            guard let urls = status.picImageURLs else{
                // 没有图片
                continue
            }
            // 有图片
            // 判断是否是只有一张
            if urls.count == 1{
                // 获得图片的rul
                let url = urls[0]
                // 在下载之前进入组
                dispatch_group_enter(group)
                // 开始异步下载
                SDWebImageManager.sharedManager().downloadImageWithURL(url, options: SDWebImageOptions(rawValue: 0), progress: nil, completed: { (image, error, _ , _ , _ ) -> Void in
                    // 下载完成离开组
                    dispatch_group_leave(group)
                    // 判断图片下载是否成功
                    if error != nil{
                      // 下载失败
                        print("下载失败")
                        return
                    }
                    // 图片下载成功
//                    print("图片下载成功：\(url)")
                    let data = UIImagePNGRepresentation(image)!
                    // 计算图片的大小 
                    length += data.length
//                    print("length:\(length)")
                })
                
            }
            
        }
        // 通知调用者图片已经下载完成
        dispatch_group_notify(group, dispatch_get_main_queue()) { () -> Void in
            // 下载图片的大小 
//            print("图片的大小是：\(CGFloat(length)/1024.0/1024.0)M")
            finished(statuses: statuses, error: nil)
        }
    }
}
